/**
 * @file drv_led.h
 * @brief LED灯带驱动 \n
 * @note 本驱动目前仅同时支持一个IO，需后期改进
 * @author wangh (wanghuan3037@fiberhome.com)
 * @version 1.0
 * @date 2020-11-30
 * @copyright Copyright (c) 2020  烽火通信
 */
#ifndef __DRV_LED_H
#define __DRV_LED_H 
#include "project_config.h"
#if DRV_LED_EN
#include <stdint.h>
#include <stdbool.h>
#include "bsp_gpio.h"
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
#include "semphr.h"


#if LED_USE_PWM
// #define LED_USE_GAMMA_CORRECTION            ///< 伽马校正
// #define LED_USE_PRECALCULATED_GAMMA_TABLE   ///< 伽马校正预计算表

#ifndef LED_LOOP_SIZE
#define LED_LOOP_SIZE           5       ///< RGB循环支持最大长度
#endif
#ifndef LED_SIZE
#define LED_SIZE                200     ///< 最大支持LED数量（num*48字节）
#endif
#define LED_START_SIZE          0
#define LED_RESET_SIZE          1       ///< PWM输出低电平，外加延时保证led reset时序


#ifdef STM32F10X
#if 1	/* PA_11 */
// #define LED_PINREMAP            GPIO_PartialRemap_TIM3  ///< IO复用

// #define LED_TIM_APB1_RCC        RCC_APB1Periph_TIM3     ///< TIM时钟
#define LED_TIM_APB2_RCC        RCC_APB2Periph_TIM1
#define LED_DMA_AHB_RCC         RCC_AHBPeriph_DMA1      ///< DMA时钟

#define LED_TIM                 TIM1                ///< PWM使用定时器
#define LED_TIM_OCINIT          TIM_OC4Init
#define LED_TIM_OCPRELOAD       TIM_OC4PreloadConfig
#define LED_TIM_DMA_CC          TIM_DMA_CC4
#define LED_TIM_DMA_CCR         (LED_TIM->CCR4)     ///< TIM CCR寄存器
#define LED_TIM_CtrlPWMOutputs  TIM_CtrlPWMOutputs

#define LED_DMA                 DMA1                ///< DMA模块
#define LED_DMA_CHANNEL         DMA1_Channel4       ///< DMA通道
#define LED_DMA_IRQ             DMA1_Channel4_IRQn  ///< DMA中断号

#define LED_DMA_IRQHANDLER      DMA1_Channel4_IRQHandler    ///< DMA中断处理函数
#define LED_DMA_IT_TC           DMA1_IT_TC4     ///< DMA传输完成标志
#define LED_DMA_IT_HT           DMA1_IT_HT4     ///< DMA半传输标志
#define LED_DMA_IT_GL           DMA1_IT_GL4     ///< DMA全局中断标志
#else 	/* PB_4 */
#define LED_PINREMAP            GPIO_PartialRemap_TIM3  ///< IO复用

#define LED_TIM_APB1_RCC        RCC_APB1Periph_TIM3     ///< TIM时钟
// #define LED_TIM_APB2_RCC
#define LED_DMA_AHB_RCC         RCC_AHBPeriph_DMA1      ///< DMA时钟

#define LED_TIM                 TIM3                ///< PWM使用定时器
#define LED_TIM_OCINIT          TIM_OC1Init
#define LED_TIM_OCPRELOAD       TIM_OC1PreloadConfig
#define LED_TIM_DMA_CC          TIM_DMA_CC1
#define LED_TIM_DMA_CCR         (LED_TIM->CCR1)     ///< TIM CCR寄存器

#define LED_DMA                 DMA1                ///< DMA模块
#define LED_DMA_CHANNEL         DMA1_Channel6       ///< DMA通道
#define LED_DMA_IRQ             DMA1_Channel6_IRQn  ///< DMA中断号

#define LED_DMA_IRQHANDLER      DMA1_Channel6_IRQHandler    ///< DMA中断处理函数
#define LED_DMA_IT_TC           DMA1_IT_TC6     ///< DMA传输完成标志
#define LED_DMA_IT_HT           DMA1_IT_HT6     ///< DMA半传输标志
#define LED_DMA_IT_GL           DMA1_IT_GL6     ///< DMA全局中断标志
#endif

#elif defined GD32F10X
/* PA_11 */
#define LED_TIM_RCU        		RCU_TIMER0      ///< TIM时钟
#define LED_TIM_DMA_RCU         RCU_DMA0      	///< DMA时钟

#define LED_TIM                 TIMER0        	///< PWM使用定时器
#define LED_TIM_CH              TIMER_CH_3     	///< PWM使用定时器通道
#define LED_TIM_DMA_CC          TIMER_DMA_CH3D
#define LED_TIM_DMA_CCR         TIMER_CH3CV( LED_TIM )	///< TIM CCR寄存器

#define LED_DMA                 DMA0                ///< DMA模块
#define LED_DMA_CHANNEL         DMA_CH3             ///< DMA通道
#define LED_DMA_IRQn            DMA0_Channel3_IRQn  ///< DMA中断号
#define LED_DMA_IRQHANDLER      DMA0_Channel3_IRQHandler    ///< DMA中断处理函数
#endif


#define LED_IRQ_PRIO            6
#define LED_IRQ_SUBPRIO         0

#define LED_FREQUENCY           24000000    ///< PWM频率
#define LED_PERIOD              30  ///< 一个周期800Khz

#define LED_PULSE_HIGH          21  ///< 21->0.875us
#define LED_PULSE_LOW           9   ///< 9->0.375us

#else
#define LED_DELAY_400NS() \
__NOP();__NOP();__NOP();__NOP(); \
__NOP();__NOP();__NOP();__NOP()

#define LED_DELAY_850NS() \
__NOP();__NOP();__NOP();__NOP(); \
__NOP();__NOP();__NOP();__NOP(); \
__NOP();__NOP();__NOP();__NOP(); \
__NOP();__NOP();__NOP();__NOP()

#define LED_DA_HIGH     PBout(4) = 1
#define LED_DA_LOW      PBout(4) = 0
#endif


/** @brief RGB颜色 */
typedef struct RGB_s
{
    uint8_t r;  ///< 红色
    uint8_t g;  ///< 绿色
    uint8_t b;  ///< 蓝色
} RGB_t;

typedef struct HSV_s
{
    int16_t h;  ///< 色调
    uint8_t s;  ///< 饱和度
    uint8_t v;  ///< 明度
} HSV_t;

/** @brief LED芯片型号 */
typedef enum 
{
    WS2811,
    WS2812,
    TM1914,
} LedChip_t;

/** @brief 点灯模式 */
typedef enum 
{
    LED_KEEP_MODE,      ///< 常亮保持模式
    LED_WATER_MODE,     ///< 流水模式
    LED_GRADUAL_MODE,   ///< 渐变模式
} LightMode_t;

/**
 * @brief LED驱动对象结构体
 */
typedef struct LedDrv_s
{
    Gpio_t DA;          ///< 数据线
    LedChip_t CHIP;
    bool IsInitialized; ///< 是否初始化
    uint8_t ws_num;     ///< 级联个数

    RGB_t rgb_loop[LED_LOOP_SIZE];  ///< 颜色循环序列
    uint8_t rgb_loop_num;       ///< 颜色循环序列数量
    LightMode_t lightMode;      ///< 点灯模式

    TimerHandle_t led_timer;    ///< 灯带效果用计时器

#if LED_USE_PWM
    uint16_t led_pulse_high;    ///< LED 1码 PWM值
    uint16_t led_pulse_low;     ///< LED 0码 PWM值

    SemaphoreHandle_t Lock;     ///< LED 设置线程安全锁
#endif
} LedDrv_t;


/**
 * @brief LED驱动初始化
 * @param[in]  obj      LED驱动对象
 * @param[in]  chip     LED驱动芯片型号
 * @param[in]  da       数据线
 * @param[in]  nws      级联个数
 * @return int8_t 
 * - @b Sucess : BSP_SUCCESS \n
 * - @b Fail
 * - @ref BSP_ERROR_INVALID_PARAM - 入参错误
 * - @ref BSP_ERROR_NO_MEM - 内存错误
 */
int8_t led_Init( LedDrv_t *obj, LedChip_t chip, PinNames da, uint8_t nws );

/**
 * @brief LED设置
 * @param[in]  obj      LED对象
 * @param[in]  rgb_loop RGB调色数组
 * @param[in]  rgb_loop_num RGB调色数组长度
 * @param[in]  mode     点灯模式
 * @param[in]  speed    点灯速率
 * @return int8_t 
 * - @b Sucess : BSP_SUCCESS \n
 * - @b Fail
 * - @ref BSP_ERROR_INVALID_PARAM - 入参错误
 */
int8_t led_set( LedDrv_t *obj, RGB_t *rgb_loop, uint8_t rgb_loop_num, LightMode_t mode, uint16_t speed);


#endif  /* DRV_LED_EN */

#endif	 // __DRV_LED_H 

/*********** (C) COPYRIGHT 2020 FiberHome *****END OF FILE****/
